package school;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 演示使用set集对象操作学生选课
 * set类型一样有泛型，也有add() remove()等方法
 * 与list最大的不同点在于访问对象时，由于set是无序集合。所以不能通过get(int)下标来访问
 * set集合也不能添加相同的数据，添加相同数据，集合只会存储第一次的引用
 * set可以添加null，一般情况下不会用到
 */

public class SetCourse {
    private List<Course> coursesToSelect;
    public  Student st;

    public SetCourse() {
        coursesToSelect = new ArrayList<Course>();

    }

    /**
     * 添加课程
     */
    public void addListCourse() {
        Course cr1 = new Course("1", "数字逻辑");
        Course cr2 = new Course("2", "数学");
        Course cr3 = new Course("3", "语文");
        coursesToSelect.add(cr1);
        coursesToSelect.add(cr2);
        coursesToSelect.add(cr3);

    }

    /**
     * 通过for each方法访问list集合，比迭代器更方便
     */
    public void testForeach() {
        System.out.println("—————————通过for each访问list课程表—————————");
        for (Object obj : coursesToSelect) {
            Course cr = (Course) obj;
            System.out.println("课程" + cr.getId() + "：" + cr.getame());
        }
    }

    //
    public void creatStudentAndSelectCourses() {
        //创建学生对象，接收键盘输入的课程id，选课
        st = new Student("1", "小明");
        System.out.println("——————欢迎学生" + st.getame() + "选课，只能选2门课——————");
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < 2; i++) {
            System.out.println("请输入课程id:");
            String courseId = scanner.next();
            Course selectCourse = null;
            for (Course cr : coursesToSelect) {
                if ((cr.getId()).equals(courseId)) {
                    selectCourse = cr;
                }
            }
            if (selectCourse == null) {
                // 请输入正确的课程
                System.out.println("请输入正确的课程ID!请重新输入：");
                i--;
            } else {
                st.setCourses(selectCourse);
            }
        }
        System.out.println("输出学生" + st.getame() + "所选的课程!");
        //set不能向list一样通过下标访问对象，以为他是无序的，只能通过foreach或者Iterator访问
        for (Course cr : st.getCourses()) {
            System.out.println("选择了课程：" + cr.getId() + ":" + cr.getame());
        }
    }

    /**
     * 测试set的contains()方法
     *
     */
    public void testSetContains(){
        //输入课程名称
        System.out.println("请输入学生已选的课程名称：");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.next();
        Course course=new Course();
        course.setName(name);
        System.out.println("新创建课程："+course.getame());
        //不重写底层hashCode和equals防范，则返回false
        //由于Student的course是由HashSet实现的Set接口
        //Object除了定义了equeals()方法，还定义了hashCode()方法-返回对象的hashCode值，当Set对象调用contains(Object)方法时，
        //其实是先调用每个元素的hashCode()方法，返回hashCode值；hashCode值相同，再调用equals(Object)方法
        // 如果也相同，才表示确实包含某一个元素
        System.out.println("备选课程中是否包括课程："+course.getame()+","+st.getCourses().contains(course));



    }



    public static void main(String[] args) {
        SetCourse lc = new SetCourse();
        lc.addListCourse();
        lc.testForeach();
        lc.creatStudentAndSelectCourses();
        lc.testSetContains();

    }


}
